로딩 중이에요... 🐣
[코담]
웹개발·실전 프로젝트·AI까지, 파이썬·장고의 모든것을 담아낸 강의와 개발 노트
03 데이터 모델링 및 테이블 생성 | ✅ 편저: 코담 운영자
3강 - 데이터 모델링 및 테이블 생성
모델(테이블) 만들기, db 설명✨ 이번 강의 목표
- 데이터베이스 모델링 개념 이해
- User, Post, Comment 모델 생성
- 관계형 모델의 구조 설정 (1:N, N:M)
- Django ORM을 활용한 모델 정의 익히기
🧩 데이터 모델링 개념
- 모델(Model): DB에 저장할 데이터를 정의하는 설계도 (스키마)
- 스키마(Schema): 테이블 구조 정의서 (열/행, 필드/값, 관계 등)
- 모델링(Modeling): 현실 세계의 객체를 DB에 구조화하는 작업
📘 주요 용어 정리
용어 | 설명 |
---|---|
테이블 | 객체 집합 (예: User, Post 등) |
행(Row) | 하나의 데이터 레코드 |
열(Column) | 속성 또는 필드 |
PK | Primary Key. 고유 식별 필드 |
FK | Foreign Key. 다른 테이블 참조 필드 |
👤 사용자 모델 (User)
AbstractUser
를 상속하여 사용자 모델을 확장합니다.
from django.contrib.auth.models import AbstractUser
from django.db import models
from django.utils.translation import gettext_lazy as _
from django.urls import reverse
class User(AbstractUser):
GENDER_CHOICES = (
('M', _('남성')),
('F', _('여성')),
('C', _('사용자 지정')),
)
name = models.CharField(_('사용자 이름'), blank=True, max_length=255)
user_name = models.CharField(_('아이디'), blank=True, max_length=255)
profile_photo = models.ImageField(_('프로필 사진'), blank=True, upload_to="profile_pics/")
website = models.URLField(_('웹사이트'), blank=True, max_length=255)
bio = models.TextField(_('소개'), blank=True)
email = models.EmailField(_('이메일'), blank=False)
phone_number = models.CharField(_('전화번호'), blank=True, max_length=20)
gender = models.CharField(_('성별'), blank=True, choices=GENDER_CHOICES, max_length=5)
followers = models.ManyToManyField(
"self", verbose_name=_("팔로워"), symmetrical=False, related_name="user_followers", blank=True
)
following = models.ManyToManyField(
"self", verbose_name=_("팔로잉"), symmetrical=False, related_name="user_following", blank=True
)
def get_absolute_url(self):
return reverse("users:detail", kwargs={"username": self.username})
symmetrical=False
로 단방향 팔로우 관계 구현 가능
🕒 공통 모델 (TimeStampedModel)
class TimeStampedModel(models.Model):
created_at = models.DateTimeField(_('생성일'), auto_now_add=True)
updated_at = models.DateTimeField(_('수정일'), auto_now=True)
class Meta:
abstract = True
생성일·수정일 자동 저장.
abstract = True
설정으로 단독 테이블로 생성되지 않음
📸 게시글 모델 (Post)
class Post(TimeStampedModel):
author = models.ForeignKey(
'users.User', null=True, on_delete=models.CASCADE,
related_name='post_author', verbose_name=_('작성자')
)
image = models.ImageField(_('이미지'), upload_to='posts/', blank=False)
caption = models.TextField(_('내용'), blank=False)
image_likes = models.ManyToManyField(
'users.User', blank=True, related_name='post_image_likes', verbose_name=_('좋아요')
)
def __str__(self):
return f"{self.author} : {self.caption}"
class Meta:
verbose_name = _('게시물')
verbose_name_plural = _('게시물들')
ordering = ['-created_at']
image_likes
는 게시글과 유저 간 다대다 관계 (좋아요 기능)
💬 댓글 모델 (Comment)
class Comment(TimeStampedModel):
author = models.ForeignKey(
'users.User', null=True, on_delete=models.CASCADE,
related_name='comment_author', verbose_name=_('작성자')
)
post = models.ForeignKey(
Post, null=True, on_delete=models.CASCADE,
related_name='comment_post', verbose_name=_('게시물')
)
contents = models.TextField(_('내용'), blank=True)
def __str__(self):
return f"{self.author} : {self.contents[:20]}"
class Meta:
verbose_name = _('댓글')
verbose_name_plural = _('댓글들')
ordering = ['-created_at']
🔁 모델 간 관계 요약
관계 | 설명 |
---|---|
User ↔ User | 팔로우/팔로잉 (N:M) |
User → Post | 작성자 (1:N) |
User → Comment | 댓글 작성자 (1:N) |
Post → Comment | 게시글의 댓글 (1:N) |
Post ↔ User | 좋아요 (N:M) |
⚙️ 마이그레이션 및 오류 대응
python manage.py makemigrations
python manage.py migrate
🔧 마이그레이션 오류 시 조치
- 기존 마이그레이션 및 DB 초기화:
rm -rf users/migrations/*
rm -rf posts/migrations/*
rm db.sqlite3 # SQLite 사용하는 경우에만
- 앱 등록 확인:
settings/base.py
LOCAL_APPS = [
"django_instagram.users",
"django_instagram.posts",
]
- 앱별 마이그레이션 실행:
python manage.py makemigrations users
python manage.py makemigrations posts
python manage.py migrate
django.contrib.sites
관련 오류:
# "django.contrib.sites",
단일 사이트 환경이라면 사이트 프레임워크는 비활성화해도 무방합니다.
✅ 정리
- 데이터 모델링은 현실 데이터를 구조화하는 핵심 작업
- 사용자, 게시물, 댓글 간의 관계를 Django 모델로 정의
- TimeStampedModel을 통해 공통 필드 관리
- 마이그레이션 및 필드 오류 발생 시 조치법 숙지
다음 강의에서는 사용자 인증 기능과 프론트 화면 구현으로 이어집니다.